home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 32
/
Amiga Format AFCD32 (Nov 1998, Issue 117).iso
/
-seriously_amiga-
/
programming
/
other
/
hrtmon
/
hrtmonload.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-08-10
|
5KB
|
262 lines
/*
Filename: HRTmonLoad.c
Author: Alain Malek
Description: Loading routines used by HRTmon and HRTmonPrefs
*/
#include "HRTmonLoad.h"
#define nb_keyboard 4 // nb keyboards selectable in HRTmonPrefs
/*******************************************************************/
static char A1200;
static char CD32;
static char AGA;
int execver;
struct GfxBase *GfxBase;
// simple Loadseg for HRTmon file
// load from memory to ABS place
CONFIG config;
// HRTmon header
typedef struct {
char jmps[20];
unsigned int mon_size;
unsigned short col0, col1;
char right;
char keyboard;
char key;
char ide;
char a1200;
char aga;
char insert;
char delay;
char lview;
char cd32;
char screenmode;
char vbr;
char entered;
char align;
} HRTCFG;
/*******************************************************************/
void set_default()
{
strcpy(config.id,"HRT");
config.version = CFGVER;
config.address = 0x1c000;
config.col0 = 0x000;
config.col1 = 0xeee;
config.abs = TRUE;
config.autoa = TRUE;
config.right = TRUE;
config.key = TRUE;
config.ide = FALSE;
config.insert = FALSE;
config.lview = TRUE;
config.vbr = TRUE;
config.keyboard = 0;
config.delay = 15;
config.screenmode = SCREEN_PAL;
}
/*******************************************************************/
void LoadInit()
{
struct ExecBase *SysBase=(int*)*((int*)4);
BPTR cf;
int bread;
GfxBase = (struct GfxBase *) OpenLibrary(GRAPHICSNAME,0);
AGA = (GfxBase->ChipRevBits0) & 8; /* Test LISA bit */
A1200 = (FindName(&(SysBase->DeviceList), "carddisk.device") != 0);
CD32 = (FindName(&(SysBase->DeviceList), "elsat.device") != 0);
execver = SysBase->LibNode.lib_Version;
set_default();
if ( cf=Open("ENV:HRTmon.prefs",MODE_OLDFILE) ) {
bread = Read(cf, &config, sizeof(CONFIG));
if (bread != sizeof(CONFIG))
config.version = 0;
Close(cf);
if(strcmp(config.id, "HRT") || config.version != CFGVER)
set_default();
if (config.screenmode >= SCREEN_MAX)
config.screenmode = SCREEN_PAL;
}
}
/*******************************************************************/
void wbmain()
{
main(1, NULL);
}
/*******************************************************************/
int Load(char *path)
{
char *Buffer;
BPTR filelock,filehandle;
struct FileInfoBlock infoblock;
int autoaddr;
char hrtname[512+32];
char tmptxt[256];
strcpy(hrtname, path);
strcat(hrtname, "HRTmon.data");
if ( (filelock=Lock(hrtname,ACCESS_READ)) == NULL ) { // Lock file
strcpy(hrtname, config.path);
strcat(hrtname, "/HRTmon.data");
if ( (filelock=Lock(hrtname,ACCESS_READ)) == NULL ) {
printf("Can't open file HRTmon.data\n");
return (TRUE);
}
}
if ( Examine(filelock,&infoblock) == FALSE ) { // Examine file
printf("Can't open file HRTmon.data\n");
UnLock(filelock);
return (TRUE);
}
UnLock(filelock); // UnLock file
if ( (Buffer=AllocMem(infoblock.fib_Size,MEMF_ANY)) == NULL ) {
printf("Not enough memory to proceed.\n");
return (TRUE);
}
if ( filehandle=Open(hrtname,MODE_OLDFILE) ) {
Read(filehandle,Buffer,infoblock.fib_Size); // Read file
Close(filehandle);
}
else { // if Can't Open
printf("Can't open file HRTmon.data\n");
return (TRUE);
}
if (config.autoa)
autoaddr = 0;
else
autoaddr = config.address;
if ( LoadABS(Buffer,&autoaddr) == FALSE ) {
FreeMem(Buffer,infoblock.fib_Size);
printf("Installation of HRTmon failed.\n");
return (TRUE);
}
FreeMem(Buffer,infoblock.fib_Size);
DoJSR((unsigned int)autoaddr+8); // Init HRTmon
sprintf(tmptxt,"HRTmon installed at $%x.\n",autoaddr);
ShowReq(tmptxt,"OK");
return (FALSE);
}
/*******************************************************************/
// Only for HRTmon.data file ! (single simple code Hunk)
// Load file from 'memory' to 'place' and AllocAbs place if 'abs'=TRUE.
int LoadABS(int *memory,int *place)
{
int *p,len,i;
int *base;
char *base2;
HRTCFG *hrtcfg;
if ( (*(memory+6) != 0x3e9) || (*memory != 0x3f3) )
return (FALSE);
len=*(memory+7);
if (*place == 0) {
if (execver >= 39)
*place = AllocMem(len*4, MEMF_PUBLIC | MEMF_REVERSE);
else
*place = AllocMem(len*4, MEMF_PUBLIC);
if (*place == 0) {
printf("Not enough memory !\n");
return(FALSE);
}
}
if (config.abs && (!config.autoa)) {
if ( AllocAbs(len*4,(APTR)*place) == 0 ) {
printf("Can't AllocAbs memory at address.\n");
return (FALSE);
}
}
CopyMemQuick( (ULONG*)memory+8, (ULONG*)*place, len*4);
if (config.abs || config.autoa)
((ULONG*)*place)[5]=len*4;
else
((ULONG*)*place)[5]=0;
hrtcfg = (HRTCFG*)(*place);
hrtcfg->col0 = config.col0;
hrtcfg->col1 = config.col1;
hrtcfg->right = config.right;
hrtcfg->keyboard = config.keyboard;
hrtcfg->key = config.key;
hrtcfg->ide = config.ide;
hrtcfg->a1200 = A1200;
hrtcfg->aga = AGA;
hrtcfg->insert = config.insert;
hrtcfg->delay = config.delay;
hrtcfg->lview = config.lview;
hrtcfg->cd32 = CD32;
hrtcfg->screenmode = config.screenmode;
hrtcfg->vbr = config.vbr;
p=memory+8+len+3; //p points on reloc_32 hunk offsets
len=*(p-2);
base2=(char*)*place;
for ( i=0; i<len ; i++ ) {
base=&base2[*p];
*base = *base + *place;
p++;
}
if (execver >= 37)
CacheClearU();
return (TRUE);
}
/*******************************************************************/